package com.dxf.chepter05

/**
 * 1 java中只有方法的重写,没有属性/字段的重写,准确的讲是[隐藏字段]代替了重写
 *
 * 2 覆盖重写 def只能重写另外一个def(方法只能重写另一个方法)
 *
 * 3 val只能重写另一个val属性或者重写不带参数的 def
 *
 * 4 var 只能重写另一个抽象的var属性   抽象的var -->
 *
 *
 *
 */
object T59_复写或重写字段 {
  def main(args: Array[String]): Unit = {
    val aaa1: AAAA = new BBBB
    val bbb2: BBBB = new BBBB
    println(aaa1.age, bbb2.age)

    println(aaa1.sal())
    println(bbb2.sal)
  }

}

class AAAA {
  val age: Int = 10

  def sal(): Int = {
    1
  }

}

class BBBB extends AAAA {
  override val age: Int = 20


  //BBBB类集成自AAAA 所以 sal 在底层会生成 sal() 但是由于 val修饰,无sal_$eq() 方法  如下:
  //    private final int sal = 20;
  //    public int sal() { return this.sal; }
  // 父类AAAA中的sal()在底层也是sal()方法
  //    public int sal() { return 1; }
  override val sal: Int = 20
}


/**
 * A03 下面写法,反编译后是
 * public abstract String name();
 *
 * public abstract void name_$eq(String paramString);
 *
 *
 *
 */
//A3 对应抽象的属性,在底层不会生成对应的属性声明,而是生成两个对应的抽象方法
abstract class A03 {
  //A1 抽象的字段就是没有初始化的字段
  var name: String //A2非抽象的  --> 类有抽象属性,则需要把类也标记为抽象的

  var age: Int = 10 // A4 非抽象的

}

class Sub_A03 extends A03 {
  //1 在子类中重新父类抽象属性,本质上实现了抽象方法,在这里可以写也可以不写
  /* override*/ var name: String = "" //override可写可不写
 // override var age:Int =20 //override必须要写,但是这样写会报错,因为 var 只能重写抽象的var 属性, 必须要把age改成 val

}